#ifndef _CRUSERS_MAMANAGER_H_
#define _CRUSERS_MAMANAGER_H_

#include "Common.h"
#include "Resource.h"
#include "ResourceManager.h"
#include "Singleton.h"
#include "String.h"
#include "Database/Field.h"
#include "DataManager.h"

#include "Threading/Mutex.h"

#define DB_NAME_CRUSERS		"cr_users"

class  Database;
class  WorldPacket;
class  WSSocketPtr;

typedef struct cr_user_tag_
{
	uint32 uid;				//用户ID
	uint32 status;			//用户状态
	String bind_phone;		//绑定手机
	String openid;			//开放平台ID
	String openkey;			//开放平台KEY
	String qbopenid;		//gbopenid操作ID
	String unionid;			//统一用户ID
	
	uint32 agentid;			//代理商ID
	String access_token;	//登录时临时生成的token
	uint32 access_time;		//令牌有效时间
	
	String push_client_id;	//推送消息的clientid 用于标识用户
	String push_token;		//推送消息的令牌
	uint32 push_notice;		//推送是否发送提示声音
	uint32 push_vibration;	//推送是否提示振动
	uint32 push_disturb;	//推送模式  1 不限制  2 关闭  3 夜晚模式
	
	String nickname;		//用户昵称
	String icon_url;		//用户头像地址
	
	uint32 gender;			//用户性别  1 男  2女 其他未知
	uint32 attentions;		//用户关注人数
	uint32 fans;			//用户粉丝数量
	uint32 friends;			//相互关注的数量
	
	String ip;				//用户最后IP地址
	String ip_addr;			//用户IP地址信息，省市县等
	
	uint32 shop_id;			//商铺ID
	uint32 refer;			//推荐人UID
	String create_time;		//创建时间
	uint32 last_time;		//最后的更新时间
	uint32 login_count;		//登录次数
	
	float judge_level;		//评价星级
	uint32 judge_count;		//评价次数
	uint32 judge_total_stars;	//评价总分数
	String judge_effect_label;	//牌友印象标签
	
	uint32 start_game_count;	//开局次数
	uint32 play_game_count;		//游戏局数
	int32 total_winlose_score;	//组局总输赢积分
	
	cr_user_tag_()
	{
		Init();
	}
	
	void Init()
	{
		uid = 0;
		status = 0;
		bind_phone = "";
		openid = "";
		openkey = "";
		qbopenid = "";
		unionid = "";
		
		agentid = 0;
		access_token = "";
		access_time = 0;
		
		push_client_id = "";
		push_token = "";
		push_notice = 0;
		push_vibration = 0;
		push_disturb = 0;
		
		nickname = "";
		icon_url = "";
		
		gender = 0;	
		attentions = 0;
		fans = 0;
		friends = 0;
		
		ip = "";
		ip_addr = "";
		
		shop_id = 0;
		refer = 0;
		create_time = "";
		last_time = 0;
		login_count = 0;
		
		judge_level = 0.0f;
		judge_count = 0;
		judge_total_stars = 0;
		judge_effect_label = "";
		
		start_game_count = 0;
		play_game_count = 0;
		total_winlose_score = 0;
	}
	
}CRUser;

enum enUserListType
{
	enUserListType_Atention = 1,	// 关注列表
	enUserListType_Fans = 2,		// 粉丝列表
	enUserListType_Friends = 3,		// 互粉列表
};


#define WGS_CRUSERS_MUTEX_NAME centerbattle_mutex
#define WGS_CRUSERS_MUTEX mutable boost::mutex WGS_CRUSERS_MUTEX_NAME;
#define WGS_CRUSERS_LOCK		boost::lock_guard<boost::mutex> wgsCRUsersMutexLock(WGS_CRUSERS_MUTEX_NAME);

//-------------------------组局信息-----------------------
class  SERVER_DECL CRUserManager:public Singleton<CRUserManager>
{
public:
	WGS_CRUSERS_MUTEX
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用 添加一条CRUsers记录
	 * @参数
	 * 	@cb	CRUser
	 */
	bool AddCRUser(CRUser & cb);
	
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用 更新friendrecord数据
	 * @参数
	 * 	@cb CRUser
	 */
	bool UpdateCRUser(const CRUser & cru);
	
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用 更新friendrecord数据
	 * @参数
	 * 	@cfr_id	
	 *	@fields	字段键值对,格式：fields["key1"] = 1; fields["key2"] = 2;...
	 */
	bool UpdateCRUser(Fields * fields, const char * QueryString, ...);
	bool UpdateCRUser(const uint32 & cru_id, Fields * fields);
	
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用 根据PD_ID获取一条PD数据
	 * @参数
	 *  @cfr_id CRUser id
	 * 	@cb		CenterGameFriend对象
	 */
	bool GetCRUser(const uint32 & uid, CRUser * cru);
	
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用 获取记录列表
	 * @参数
	 * 	@lstData	CenterFriendRecord对象列表
	 *  @query 查询语句条件
	 */
	uint32 GetCRUsersList(std::list<CRUser> * lstData, const char * query,...);
	
public:
	
	//========================逻辑操作相关===================================
	bool UpdateUserIpAddr(const uint32 & uid, String ip, String ip_addr);
	//========================逻辑操作相关===================================
	
};

#define	 sCRUsersMgr		 CRUserManager::getSingleton()



typedef struct _user_config_
{
	uint32 config_id;		// 记录ID
	uint32 group_id;		// 游戏组ID
	uint32 status;			// 配置状态（0 正常 255 删除）
	uint32 pid;				// 玩家PID
	uint32 last_gzid;		// 最后一次创建的分区ID
	uint32 last_gameid;		// 最后一次创建的游戏ID
	uint32 last_mode;		// 最后一次创建的游戏模式
	
	String last_time;		// 上次更新时间（自动更新，不需填充）
	String user_data;		// 用户数据
	String config;			// 配置内容
	String info;			// 信息内容
	String create_time;		// 创建时间
	
	_user_config_()
	{
		Init();
	}
	
	void Init()
	{
		config_id = 0;
		group_id = 0;
		status = 0;
		pid = 0;
		last_gzid = 0;
		last_gameid = 0;
		last_mode = 0;
		
		last_time = "";
		user_data = "";
		config = "";
		info = "";
		create_time = "";
	}
	
}UserConfig;

#define DB_NAME_USERCONFIG		"user_config"

#define WGS_USERCONFIG_MUTEX_NAME userconfig_mutex
#define WGS_USERCONFIG_MUTEX mutable boost::mutex WGS_USERCONFIG_MUTEX_NAME;
#define WGS_USERCONFIG_LOCK		boost::lock_guard<boost::mutex> wgsUserConfigMutexLock(WGS_USERCONFIG_MUTEX_NAME);


//-------------------------组局信息-----------------------
class  SERVER_DECL UserConfigManager:public Singleton<UserConfigManager>
{
public:
	WGS_USERCONFIG_MUTEX
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用 添加一条记录
	 * @参数
	 * 	@uc	UserConfig
	 */
	bool AddUserConfig(UserConfig & uc);
	
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用 更新数据
	 * @参数
	 * 	@uc UserConfig
	 */
	bool UpdateUserConfig(const UserConfig & uc);
	
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用 更新数据
	 * @参数
	 * 	@config_id	
	 *	@fields	字段键值对,格式：fields["key1"] = 1; fields["key2"] = 2;...
	 */
	bool UpdateUserConfig(Fields * fields, const char * QueryString, ...);
	bool UpdateUserConfig(const uint32 & config_id, Fields * fields);
	
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用	获取一条数据
	 * @参数
	 *  @config_id UserConfig id
	 * 	@cb		CenterGameFriend对象
	 */
	bool GetUserConfig(const uint32 & config_id, UserConfig * uc);
	
	/**
	 * @创建时间 2016-11-28
	 * @创建人 Roach
	 * @函数作用 获取记录列表
	 * @参数
	 * 	@lstData	CenterFriendRecord对象列表
	 *  @query 查询语句条件
	 */
	uint32 GetUserConfigList(std::list<UserConfig> * lstData, const char * query,...);
	
public:
	// 添加或更新游戏记录
	bool AddCenterBattleConfig(String & config);
	// 获得游戏记录
	String GetCenterBattleConfig(const uint32 & pid, const uint32 & game_id, const uint32 & mode);
};


#define	 sCRUserConfigMgr		 UserConfigManager::getSingleton()

#endif
